#include "MarsPrecompile.h"

#include <Windows.h>
#include <memory>

#include "MarsExample0.h"

LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );

int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE prevInstance, LPWSTR cmdLine, int cmdShow )
{
	UNREFERENCED_PARAMETER( prevInstance );
	UNREFERENCED_PARAMETER( cmdLine );

	LPCTSTR pClassName = "MarsWindowClass";

	WNDCLASSEX wndClass = { 0 };
	wndClass.cbSize = sizeof( WNDCLASSEX ) ;
	wndClass.style = CS_HREDRAW | CS_VREDRAW;
	wndClass.lpfnWndProc = WndProc;
	wndClass.hInstance = hInstance;
	wndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
	wndClass.hbrBackground = ( HBRUSH )( COLOR_WINDOW + 1 );
	wndClass.lpszMenuName = NULL;
	wndClass.lpszClassName = pClassName;

	if ( !RegisterClassEx( &wndClass ) )
		return -1;

	RECT rc = { 0, 0, 640, 480 };
	AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, FALSE );

	HWND hwnd = CreateWindow( pClassName, 
							  "Blank Direct3D 11 Window", 
							  WS_OVERLAPPEDWINDOW,
							  CW_USEDEFAULT, 
							  CW_USEDEFAULT, 
							  rc.right - rc.left, 
							  rc.bottom - rc.top,
							  NULL, 
							  NULL, 
							  hInstance, 
							  NULL );

	if ( !hwnd )
		return -1;

	ShowWindow( hwnd, cmdShow );

	MarsExample0 example;

	// Demo Initialize
	bool result = example.Initialize( hInstance, hwnd );

	if ( result == false )
		return -1;

	MSG msg = { 0 };

	while ( msg.message != WM_QUIT )
	{
		if ( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )
		{
			TranslateMessage( &msg );
			DispatchMessage( &msg );
		}

		// Update and Draw
		example.Update( 0.0f );
		example.Render();
	}

	// Demo Shutdown
	example.Shutdown();

	return static_cast<int>( msg.wParam );
}


LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
	PAINTSTRUCT paintStruct;
	HDC hDC;

	switch( message )
	{
	case WM_PAINT:
		hDC = BeginPaint( hwnd, &paintStruct );
		EndPaint( hwnd, &paintStruct );
		break;

	case WM_DESTROY:
		PostQuitMessage( 0 );
		break;

	default:
		return DefWindowProc( hwnd, message, wParam, lParam );
	}

	return 0;
}